package com.cloudlead.utils.scheduler;

import java.util.Date;
import java.util.Set;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.JobListener;
import org.quartz.Scheduler;
import org.quartz.SchedulerListener;
import org.quartz.TimeOfDay;
import org.quartz.Trigger;
import org.quartz.Trigger.TriggerState;
import org.quartz.TriggerListener;

/**
 * 计划任务服务
 * 
 * @author dean.lu
 */
public interface ScheduledTaskService {
	
	public static final String SPRING_CONTEXT_KEY = "applicationContext";
	/**
	 * 启动计划任务
	 */
	public void start();

	/**
	 * 停止计划任务
	 */
	public void stop();

	/**
	 * 添加工作
	 * 
	 * @param jobClass
	 *            工作类
	 * @param name
	 *            工作名称
	 * @param group
	 *            所属分组
	 * @param dataMap
	 *            数据参数
	 * @param startTime
	 *            开始时间
	 */
	JobKey addJob(Class<? extends Job> jobClass,String name, String group,
			JobDataMap dataMap, TimeOfDay startTime);

	/**
	 * 添加工作
	 * 
	 * @param jobClass
	 *            工作类
	 * @param name
	 *            工作名称
	 * @param group
	 *            所属分组
	 * @param dataMap
	 *            数据参数
	 * @param startTime
	 *            开始时间
	 * @param period
	 *            周期
	 */
	JobKey addJob(Class<? extends Job> jobClass,String name, String group,
			JobDataMap dataMap, TimeOfDay startTime, long period);

	/**
	 * 添加工作
	 * 
	 * @param jobClass
	 *            工作类
	 * @param name
	 *            工作名称
	 * @param group
	 *            所属分组
	 * @param dataMap
	 *            数据参数
	 * @param cron
	 *            表达式
	 */
	JobKey addJob(Class<? extends Job> jobClass,String name, String group,
			JobDataMap dataMap, String cron);

	/**
	 * 添加工作
	 * 
	 * @param jobClass
	 *            工作类
	 * @param name
	 *            工作名称
	 * @param group
	 *            所属分组
	 * @param dataMap
	 *            数据参数
	 * @param cron
	 *            表达式
	 * @param startTime
	 *            开始时间
	 * @param endTime
	 *            结束时间
	 */
	JobKey addJob(Class<? extends Job> jobClass,String name, String group,
			JobDataMap dataMap, String cron, Date startTime, Date endTime);

	/**
	 * 添加工作
	 * 
	 * @param jobDetail
	 *            工作详情
	 * @param trigger
	 *            触发器
	 * @return 工作主键
	 */
	JobKey addJob(JobDetail jobDetail, Trigger trigger);

	/**
	 * 添加工作
	 * 
	 * @param xml
	 *            工作定义XML
	 * @param systemId
	 */
	void addJob(String xml, String systemId);

	/**
	 * 暂停工作
	 * 
	 * @param name
	 *            工作名称
	 * @param group
	 *            工作分组
	 */
	void pauseJob(String name, String group);

	/**
	 * 恢复工作
	 * 
	 * @param name
	 *            工作名称
	 * @param group
	 *            工作分组
	 */
	void resumeJob(String name, String group);

	/**
	 * 删除工作
	 * 
	 * @param name
	 *            工作名称
	 * @param group
	 *            工作分组
	 */
	void deleteJob(String name, String group);

	/**
	 * 暂停工作组
	 * 
	 * @param group
	 *            工作分组
	 */
	void pauseGroup(String group);

	/**
	 * 恢复工作组
	 * 
	 * @param group
	 *            工作分组
	 */
	void resumeGroup(String group);

	/**
	 * 删除工作组
	 * 
	 * @param group
	 *            工作分组
	 */
	void deleteGroup(String group);

	/**
	 * 暂停所有工作
	 */
	void pauseAll();

	/**
	 * 恢复所有工作
	 */
	void resumeAll();

	/**
	 * 删除所有工作
	 */
	void deleteAll();

	/**
	 * 工作列表
	 * 
	 * @param group
	 *            工作分组
	 * @param jobClassName
	 *            类名
	 * @param triggerState
	 *            触发器状态
	 * @return 元数据列表
	 */
	Set<JobMetadata> listJobMetadata(String group, String jobClassName,
			TriggerState triggerState);

	/**
	 * 添加工作监听器
	 * 
	 * @param jobListener
	 *            工作监听器
	 * @param jobKeys
	 *            待监听的工作主键列表
	 */
	void addJobListener(JobListener jobListener, JobKey... jobKeys);

	/**
	 * 添加触发器监听器
	 * 
	 * @param triggerListener
	 *            触发器监听器
	 * @param jobKeys
	 *            待监听的工作主键列表
	 */
	void addTriggerListener(TriggerListener triggerListener, JobKey... jobKeys);

	/**
	 * 添加计划监听器
	 * 
	 * @param schedulerListener
	 *            计划监听器
	 */
	void addSchedulerListener(SchedulerListener schedulerListener);

	/**
	 * 删除工作监听器
	 * 
	 * @param jobListenerName
	 *            工作监听器名称
	 */
	void removeJobListener(String jobListenerName);

	/**
	 * 删除触发器监听器
	 * 
	 * @param triggerListenerName
	 *            触发器监听器名称
	 */
	void removeTriggerListener(String triggerListenerName);

	/**
	 * 删除计划监听器
	 * 
	 * @param schedulerListener
	 *            计划监听器
	 */
	void removeSchedulerListener(SchedulerListener schedulerListener);

	Scheduler getQuartzScheduler();
}